package model.singleton;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

	private static HibernateUtil instance = null;
	private static Session session = null;
	private static SessionFactory sFacto;

	private HibernateUtil() { }

	// Permet de récupérer l'instance d'hibernate.
	public static HibernateUtil getInstance() {
		if (instance == null) {
			instance = new HibernateUtil();
		}
		return instance;
	}

	// Permet de récupérer la session d'hibernate.
	public static Session getSession() {
		if (session == null) {
			Configuration configuration = new Configuration();
			configuration.configure("hibernate.cfg.xml");
			StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
					.applySettings(configuration.getProperties());
			sFacto = configuration.buildSessionFactory(ssrb.build());
			session = sFacto.openSession();
		}
		return session;
	}
	
	/****
	 * request : Cette méthode est utilisée pour réaliser des requêtes de base sur hibernate.
	 * 		Pour récupérer une classe spécifique.
	 * 
	 * @param query La requêtes.
	 * @param table La table.
	 * @return Une liste d'objet associé à la table spécifié.
	 */
	@SuppressWarnings("rawtypes" )
	public static List requete(String query, Class table) {
		return HibernateUtil.getSession().createSQLQuery(query).addEntity(table).list();
	}
	
	/****
	 * request : Cette méthode est utilisée pour réaliser des requêtes de base sur hibernate.
	 * 		Pour récupérer une classe spécifique.
	 * 
	 * @param query La requêtes.
	 * @return Une liste d'objet.
	 */
	@SuppressWarnings("rawtypes" )
	public static List requete(String query) {
		return HibernateUtil.getSession().createSQLQuery(query).list();
	}
}